package com.averyday.demo.designMode.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Description
 * Author ayt  on
 */
public class ProxyFactory {
	private Object target;

	public ProxyFactory(Object target) {
		this.target = target;
	}

	//1. ClassLoader loader ： 指定当前目标对象使用的类加载器, 获取加载器的方法固定
	//2. Class<?>[] interfaces: 目标对象实现的接口类型，使用泛型方法确认类型
	//3. InvocationHandler h : 事情处理，执行目标对象的方法时，会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入
	public Object getProxyInstance() {
		//利用反射机制动态的构建一个代理对象
		Object object = Proxy.newProxyInstance(this.target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				//利用反射机制获取 代理对象的方法执行后的结果
				System.out.println("反射方法执行前");
				Object returnVal = method.invoke(target, args);
				System.out.println("反射方法执行后");
				return returnVal;
			}
		});
		return object;
	}
}
